<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 正则表达式的拓展方法  => 官方提供,专门操作正则表达式的方法

    // 用法: 正则.xxx()

    // test()   检索字符串,判断字符串中是否存在符合规则的内容(某个或某段字符)  存在=>true 不存在 =>false
    // exec()   检索字符串,将字符串中符合规则的内容(某个或某段字符)提取出来放到数组中  存在 => 数组  不存在 => null

    // var str = "good good study , day day up";
    // var reg = /day/;  // day
    // console.log(reg.test(str));

    // var str = "good good study , Day dAy up";
    // var reg = /day/;   // day
    // console.log(reg.test(str));

    // var str = "good good study , Day dAy up";
    // var reg = /day/i;   // D|d  A|a  Y|y
    // console.log(reg.test(str));

    // ----------------------------------------------------------

    // 如果不添加修饰符g,在检索字符串过程中默认从头开始检索,如果字符串中存在符合规则的字符/字符串 停止检索返回true, 否则返回false
    // 如果添加修饰符g,在检索字符串过程中默认从头开始检索(lastIndex = 0),如果字符串中存在符合规则的字符/字符串,返回true,并记录下次检索的开始位置(lastIndex),下次继续从记录位置开始向后检索,依次类推,检索不到 返回false(lastIndex重置为0)
    // reg.lastIndex  记录检索开始的位置

    // var str = "good good study , Day dAy up";
    // var reg = /day/ig;

    // console.log(reg.lastIndex, reg.test(str)); // 0  true => 21
    // console.log(reg.lastIndex, reg.test(str)); // 21 true =>  25
    // console.log(reg.lastIndex, reg.test(str)); // 25 false => 0

    // console.log(reg.lastIndex, reg.test(str)); // 0  true => 21
    // console.log(reg.lastIndex, reg.test(str)); // 21 true =>  25
    // console.log(reg.lastIndex, reg.test(str)); // 25 false => 0


    // ---------------exec----------------
    // var str = "good good study , day day up";
    // var reg = /day/;  // day
    // console.log(reg.exec(str));

    // var str = "good good study , Day dAy up";
    // var reg = /day/;   // day
    // console.log(reg.exec(str));

    // var str = "good good study , Day dAy up";
    // var reg = /day/i;   // D|d  A|a  Y|y
    // console.log(reg.exec(str));

    // 如果不添加修饰符g,在检索字符串过程中默认从头开始检索,如果字符串中存在符合规则的字符/字符串 停止检索返回数组, 否则返回null
    // 如果添加修饰符g,在检索字符串过程中默认从头开始检索(lastIndex = 0),如果字符串中存在符合规则的字符/字符串,返回数组,并记录下次检索的开始位置(lastIndex),下次继续从记录位置开始向后检索,依次类推,检索不到 返回null(lastIndex重置为0)
    // reg.lastIndex  记录检索开始的位置

    var str = "good good study , Day dAy up";
    var reg = /day/ig;

    console.log(reg.lastIndex, reg.exec(str)); // 0  true => 21
    console.log(reg.lastIndex, reg.exec(str)); // 21 true =>  25
    console.log(reg.lastIndex, reg.exec(str)); // 25 false => 0

    console.log(reg.lastIndex, reg.exec(str)); // 0  true => 21
    console.log(reg.lastIndex, reg.exec(str)); // 21 true =>  25
    console.log(reg.lastIndex, reg.exec(str)); // 25 false => 0


    // 模拟封装  => 匹配字符串中所有符合规则的某个或某段字符
    function match(str, reg) {
        var arr = [];
        var item = null;
        if (reg.global) {
            while (item = reg.exec(str)) { //  [day]  null  => 先检索字符串 将检索的结果赋值给 item => 并作为while的表达式
                arr.push(item[0]);
            }
            return arr.length ? arr : null;
        } else {
            return reg.exec(str);
        }

    }

    var str = "good good study , Day dAy up";
    var reg = /day/ig;
    console.dir(reg);
    var arr = match(str, reg);
    console.log(arr);

    // 模拟封装  => 将字符串中符合规则的某个或某段字符 替换为 新字符串
    // function replace(str, reg, newStr) {
    //     var item = null;
    //     if (reg.global) {
    //         while (item = reg.exec(str)) { //  [day]  null  => 先检索字符串 将检索的结果赋值给 item => 并作为while的表达式
    //             str = str.replace(item[0], newStr);
    //         }

    //     } else {
    //         item = reg.exec(str)
    //         str = str.replace(item[0], newStr);
    //     }

    //     return str;
    // }



    function replace(str, reg, fn) {
        var item = null;
        if (reg.global) {
            while (item = reg.exec(str)) { //  [day]  null  => 先检索字符串 将检索的结果赋值给 item => 并作为while的表达式
                var newStr = fn(item[0]);
                str = str.replace(item[0], newStr);
            }

        } else {
            item = reg.exec(str);
            var newStr = fn(item[0]);
            str = str.replace(item[0], newStr);
        }

        return str;
    }


    var str = "good good study , Day dAy up";
    var reg = /day/ig;
    console.dir(reg);
    var arr = replace(str, reg, "money");
    console.log(arr);





</script>

</html>